#ifndef LinkContext_h
#define LinkContext_h

struct LinkContext;
typedef struct LinkContext *LinkContextRef;


namespace HHLink {


    void ReleaseContext();
    LinkContextRef GetContext();

/**
 * 设置deviceId（设备Mac地址）
 * @param context
 * @param deviceId 传nullptr，标示ble断开连接，会清空数据
 */
    void ContextSetDeviceId(LinkContextRef context, const char *deviceId);

/**
 * 获取deviceId（设备Mac地址）
 * @param context
 * @param deviceId c字符串，使用后需free
 * @param length
 */
    void ContextGetDeviceId(LinkContextRef context, char **deviceId, int *length);

/**
 * 设置ID
 * @param context
 * @param ID
 */
    void ContextSetID(LinkContextRef context, unsigned char ID);

/**
 * 获取ID
 * @param context
 * @return
 */
    unsigned char ContextGetID(LinkContextRef context);

/**
 * 设置cmd
 * @param context
 * @param cmd
 */
    void ContextSetCmd(LinkContextRef context, unsigned char cmd);

/**
 * 获取cmd
 * @param context
 * @return
 */
    unsigned char ContextGetCmd(LinkContextRef context);

/**
 * 设置长度
 * @param context
 * @param length
 */
    void ContextSetLength(LinkContextRef context, unsigned short length);

/**
 * 获取长度
 * @param context
 * @return
 */
    unsigned short ContextGetLength(LinkContextRef context);

/**
 * 设置产品型号
 * @param context
 * @param type see enum HHLinkProductType
 */
    void ContextSetProductType(LinkContextRef context, int type);

/**
 * 获取产品型号
 * @param context
 * @return see enum HHLinkProductType
 */
    int ContextGetProductType(LinkContextRef context);

/**
 * 设置产品系列
 * @param context
 * @param series see enum HHLinkProductSeries
 */
    void ContextSetProductSeries(LinkContextRef context, int series);

/**
 * 获取产品系列
 * @param context
 * @return series see enum HHLinkProductSeries
 */
    int ContextGetProductSeries(LinkContextRef context);


/**
 * 设置ble固件 version
 * @param context
 * @param version
 */
    void ContextSetBleVersion(LinkContextRef context, char *version);

/**
 * 获取ble固件 version
 * @param context
 * @param version c字符串，使用后需free
 */
    void ContextGetBleVersion(LinkContextRef context, char **version);

/**
 * 设置稳定器固件版本
 * @param context
 * @param version
 */
    void ContextSetGimbalVersion(LinkContextRef context, char *version);

/**
 * 获取稳定器固件版本
 * @param context
 * @param version c字符串，使用后需free
 */
    void ContextGetGimbalVersion(LinkContextRef context, char **version);

    void ContextSetChargeStatus(LinkContextRef context, char status);
    void ContextGetChargeStatus(LinkContextRef context, char *status);
    void ContextSetRunningStatus(LinkContextRef context, char status);
    void ContextGetRunningStatus(LinkContextRef context, char *status);
    void ContextSetPower(LinkContextRef context, float power);
    void ContextGetPower(LinkContextRef context, float *power);

// /**
//  * 设置当前模板flag
//  * @param context
//  * @param flag
//  */
// void ContextSetTemplateFlag(LinkContextRef context, char flag);
//
// /**
//  * 获取当前模版flag
//  * @param context
//  * @return
//  */
// char ContextGetTemplateFlag(LinkContextRef context);

/**
 * 设置错误码
 * @param context
 * @param code (0:正常，1：超时)
 */
    void ContextSetErrorCode(LinkContextRef context, char code);

/**
 * 获取错误码
 * @param context
 * @return (0:正常，1：超时)
 */
    char ContextGetErrorCode(LinkContextRef context);

/**
 * result
 * @param context
 * @param result
 */
    void ContextSetResult(LinkContextRef context, bool result);
    void ContextGetResult(LinkContextRef context, bool *result);
    void ContextSetResult(LinkContextRef context, char result);
    void ContextGetResult(LinkContextRef context, char *result);


/**
 * 设置payload 1.传入的数据会深拷贝
 * @param context
 * @param payload
 * @param length
 */
    void ContextSetPayload(LinkContextRef context, char *payload, int length);

/**
 * 获取payload 1.获取的数据为深拷贝；2.payload传nullptr时，会动态分配内存，使用完后请free，防止内存泄露
 * @param context
 * @param payload
 * @param length
 */
    void ContextGetPayload(LinkContextRef context, char **payload, int *length);

/**
 * 设置串码
 * @param context
 * @param serialNumber
 */
    void ContextSetSerialNumber(LinkContextRef context, char *serialNumber);

/**
 * 获取串码
 * @param context
 * @param serialNumber 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetSerialNumber(LinkContextRef context, char **serialNumber, int *length);

/**
 * 设置company
 * @param context
 * @param company
 */
    void ContextSetCompany(LinkContextRef context, char *company);

/**
 * 获取company
 * @param context
 * @param company 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetCompany(LinkContextRef context, char **company, int *length);

/**
 * 设置设备信息
 * @param context
 * @param device
 */
    void ContextSetDevice(LinkContextRef context, char *device);

/**
 * 获取设备信息
 * @param context
 * @param device 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetDevice(LinkContextRef context, char **device, int *length);

/**
 * 设置订单号
 * @param context
 * @param device
 */
    void ContextSetOrder(LinkContextRef context, char *order);

/**
 * 获取订单号
 * @param context
 * @param device 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetOrder(LinkContextRef context, char **device, int *length);

/**
 * 设置拓展标识位
 * @param context
 * @param extended
 */
    void ContextSetExtended(LinkContextRef context, char *extended);

/**
 * 获取拓展标识位
 * @param context
 * @param extended 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetExtended(LinkContextRef context, char **extended, int *length);

/**
 * 设置年份
 * @param context
 * @param year
 */
    void ContextSetYear(LinkContextRef context, char *year);

/**
 * 获取年份
 * @param context
 * @param year 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetYear(LinkContextRef context, char **year, int *length);

/**
 * 设置月份
 * @param context
 * @param month
 */
    void ContextSetMonth(LinkContextRef context, char *month);

/**
 * 获取月份
 * @param context
 * @param month 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetMonth(LinkContextRef context, char **month, int *length);

/**
 * 设置日
 * @param context
 * @param day
 */
    void ContextSetDay(LinkContextRef context, char *day);

/**
 * 获取日
 * @param context
 * @param day 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetDay(LinkContextRef context, char **day, int *length);

/**
 * 设置流水码
 * @param context
 * @param serialCode
 */
    void ContextSetSerialCode(LinkContextRef context, char *serialCode);

/**
 * 获取流水码
 * @param context
 * @param serialCode 深拷贝的，动态分配的，注意使用完后free
 * @param length
 */
    void ContextGetSerialCode(LinkContextRef context, char **serialCode, int *length);

/**
 * 设置当前云台event事件
 * @param context
 * @param event
 */
    void ContextSetEvent(LinkContextRef context, int event);

/**
 * 获取当前云台event事件
 * @param context
 * @return
 */
    int ContextGetEvent(LinkContextRef context);

/**
 * 设置屏幕方向
 * @param context
 * @param orientation
 */
    void ContextSetOrientation(LinkContextRef context, int orientation);

/**
 * 获取屏幕方向
 * @param context
 * @return
 */
    int ContextGetOrientation(LinkContextRef context);

/**
 * 设置当前是否是前置摄像头
 * @param context
 * @param isCameraFront
 */
    void ContextSetIsCameraFront(LinkContextRef context, bool isCameraFront);

/**
 * 读取当前是否是前置摄像头
 * @param context
 * @return
 */
    bool ContextGetIsCameraFront(LinkContextRef context);

/**
 * 设置航向方向反向
 * @param context
 * @param dir (0代表关,1代表开)
 */
    void ContextSetPanDirection(LinkContextRef context, int dir);

/**
 * 获取航向方向反向
 * @param context
 * @return (0代表关,1代表开)
 */
    int ContestGetPanDirection(LinkContextRef context);

/**
 * 设置航向速度
 * @param context
 * @param speed
 */
    void ContextSetPanSpeed(LinkContextRef context, int speed);

/**
 * 获取航向速度
 * @param context
 * @return
 */
    int ContextGetPanSpeed(LinkContextRef context);

/**
 * 获取当前支持的工作模式数组
 * @param context
 * @param array
 * @param length
 */
    void ContextGetGimbalWorkModeArray(LinkContextRef context, char **array, int *length);

/**
 * 设置工作模式
 * @param context
 * @param mode 0:PF 1:PTF 2:L 3:POV 4:DIY
 */
    void ContextSetGimbalWorkMode(LinkContextRef context, int mode);

/**
 * 读取工作模式
 * @param context
 * @return mode 0:PF 1:PTF 2:L 3:POV 4:DIY
 */
    int ContextGetGimbalWorkMode(LinkContextRef context);

/**
 * 设置是否支持自定义工作模式
 * @param context
 * @param isSupport
 */
    void ContextSetIsSupportCustomWorkMode(LinkContextRef context, bool isSupport);

/**
 * 读取是否支持自定义工作模式
 * @param context
 * @return
 */
    bool ContextGetIsSupportCustomWorkMode(LinkContextRef context);

/**
 * 支持自定义工作模式下，获取自定义工作模式的模式数组
 * @param context
 * @param array see LINK_GIMBAL_WORK_MODE_CUSTOM
 * @param length
 */
    void ContextGetSupportCustomWorkModeArray(LinkContextRef context, char **array, int *length);

/**
 * 设置自定义工作模式子项值
 * @param context
 * @param mode 自定义工作模式子项类型
 * @param value 子项的值 0：关 1：开
 */
    void ContextSetCustomWorkModeSubValue(LinkContextRef context, char mode, int value);

/**
 * 读取指定自定义工作模式子项的值
 * @param context
 * @param mode 自定义工作模式子项类型
 * @return 子项的值 0：关 1：开
 */
    int ContextGetCustomWorkModeSubValue(LinkContextRef context, char mode);

/**
 * 设置稳定器对应轴的状态
 * @param context
 * @param axis 轴 0:pan 1:tilt 2:roll
 * @param state 0:lock 1:follow
 */
    void ContextSetAxisState(LinkContextRef context, int axis, int state);

/**
 * 获取稳定器对应轴的状态
 * @param context
 * @param axis 轴 0:pan 1:tilt 2:roll
 * @return state 0:lock 1:follow
 */
    int ContextGetAxisState(LinkContextRef context, int axis);

/**
 * 获取稳定器对应轴的微调值
 * @param context
 * @param axis 轴 0:pan 1:tilt 2:roll
 * @return
 */
    float ContextGetAxisOffset(LinkContextRef context, int axis);

/**
 * 获取当前跟踪速度模式的集合，记得free
 * @param context
 * @param array
 * @param length
 */
    void ContextGetFollowSpeedModeArray(LinkContextRef context, char **array, int *length);

/**
 * 设置当前跟踪速度
 * @param context
 * @param mode 稳拍风格&跟随速度(0:柔顺&慢速，1：常规&中速，2：运动&快速，3：速度)
 */
    void ContextSetFollowSpeedMode(LinkContextRef context, int mode);

/**
 * 获取当前跟踪速度
 * @param context
 * @return
 */
    int ContextGetFollowSpeedMode(LinkContextRef context);

/**
 * 设置电机响应&力度
 * @param context
 * @param mode see @LINK_GIMBAL_MOTOR_FORCE
 */
    void ContextSetMotorForce(LinkContextRef context, int mode);

/**
 * 获取电机响应&力度
 * @param context
 * @return see @LINK_GIMBAL_MOTOR_FORCE
 */
    int ContextGetMotorForce(LinkContextRef context);

/**
 * 获取航向电机力度值，支持自定义电机力度的设备才有效
 * @param context
 * @return
 */
    int ContextGetMotorForceValueForPan(LinkContextRef context);

/**
 * 获取俯仰电机力度值，支持自定义电机力度的设备才有效
 * @param context
 * @return
 */
    int ContextGetMotorForceValueForTilt(LinkContextRef context);

/**
 * 获取横滚电机力度值，支持自定义电机力度的设备才有效
 * @param context
 * @return
 */
    int ContextGetMotorForceValueForRoll(LinkContextRef context);

/**
 * 设置摇杆航向控制方向
 * @param context
 * @param dir 0:正向，1:反向
 */
    void ContextSetRockerPanDirection(LinkContextRef context, int dir);

/**
 * 获取摇杆航向控制方向
 * @param context
 * @return 0:正向，1:反向
 */
    int ContextGetRockerPanDirection(LinkContextRef context);

/**
 * 设置摇杆航向速度
 * @param context
 * @param speed
 */
    void ContextSetRockerPanSpeed(LinkContextRef context, int speed);

/**
 * 获取摇杆航向速度
 * @param context
 * @return
 */
    int ContextGetRockerPanSpeed(LinkContextRef context);

/**
 * 设置摇杆俯仰控制方向
 * @param context
 * @param dir 0:正向，1:反向
 */
    void ContextSetRockerTiltDirection(LinkContextRef context, int dir);

/**
 * 获取摇杆俯仰控制方向
 * @param context
 * @return 0:正向，1:反向
 */
    int ContextGetRockerTiltDirection(LinkContextRef context);

/**
 * 设置摇杆俯仰速度
 * @param context
 * @param speed
 */
    void ContextSetRockerTiltSpeed(LinkContextRef context, int speed);

/**
 * 获取摇杆俯仰速度
 * @param context
 * @return
 */
    int ContextGetRockerTiltSpeed(LinkContextRef context);

/**
 * 获取云台提示音状态
 * @param context
 * @return (0:关 1:开)
 */
    int ContextGetGimbalTone(LinkContextRef context);

/**
 * 当前是否支持自定义A/B点移动时长设置
 * @param context
 * @return
 */
    bool ContextGetSupportCustomABDuration(LinkContextRef context);

/**
 * 当前是否支持A/B点移动时长秒级别设置
 * @param context
 * @return
 */
    bool ContextGetSupportABDurationSecond(LinkContextRef context);

/**
 * 获取当前的A/B点移动时长
 * @param context
 * @return
 */
    int ContextGetABDurationSecond(LinkContextRef context);

/**
 * 获取盗梦空间速度
 * @param context
 * @return
 */
    int ContextGetGimbalInceptionSpeed(LinkContextRef context);

/**
 * 获取开机横竖屏方向
 * @param context
 * @return 开机方向 1：竖屏，2：横屏朝上，0：横屏朝下
 */
    int ContextGetGimbalBootScreenDirection(LinkContextRef context);


}

#endif /* LinkContext_h */
